package org.webapp.managedBeans;

import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;

import org.ejb.entities.Utilisateur;
import org.primefaces.event.FlowEvent;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.model.ArrayDataModel;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpSession;

//import org.apache.log4j.Logger;
import java.io.Serializable;
import java.util.logging.Logger;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.ejb.api.ICaddieRemote;
import org.ejb.api.UtilisateurInterface;
import org.ejb.entities.Address;
import org.ejb.entities.CartItem;
import org.ejb.entities.Item;
import org.ejb.entities.Utilisateur;
import org.ejb.entities.ValidationException;
import org.primefaces.event.FlowEvent;
import org.ejb.api.*;
import org.ejb.stateless.*;
import org.ejb.entities.*;
import java.util.LinkedList;


@ManagedBean
@SessionScoped
public class MagasinBean implements Serializable{
	//private static final Logger log = Logger.getLogger(MagasinBean.class);
	ProduitInterface ui;
	// constructeur publique sans argument

	@SuppressWarnings("unused")
	public MagasinBean() {	
		System.out.println("Appel du constructeur");
		//pagination = new Pagination();
		genres.add("Tous");
		genres.add("FPS");
		genres.add("RPG");
		genres.add("Sport");
		genres.add("Combat");
		genres.add("Infiltration");
		genres.add("Course");
		genres.add("Plates-formes");
		genres.add("Stratégie");
		genres.add("Arcade");
		consoles.add("Tous");
		consoles.add("PC");
		consoles.add("Xbox360");
		consoles.add("PS3");
		consoles.add("Wii");
		consoles.add("DS");
		consoles.add("PSP");
		consoles.add("MAC");

		if (items == null)
			items = new LinkedList<Item>();
		Float coast = new Float(25);

		ui=null;
		ICaddieRemote cr=null;

		//Item i = new Item("mgs", "jeu d'infiltration ou vous incarnez snake", "resources/images/jaquette/prototype_jaquette", 5, 2, 45, "FPS", "PS3");
		Produit p = new Produit("jeux video", "la rubrique qui concerne les jeux video");
		// fonctionne mais aucune utilite pour le moment
		if (p == null){
			log.info("le produit n'est pas bien instancie");
		}

		InitialContext ic;
		try {
			ic = new InitialContext();	
			ui = (ProduitInterface)ic.lookup(LOOKUP_PRODUIT);
			cr = (ICaddieRemote)ic.lookup(LOOKUP_CADDIE);
			//ui.createItem(new Item ("mgs", coast), new Produit("jeux video", "les jeux video"));
			if (ui == null){
				log.info("L'interface n'est pas bien instanciee");
			}
			else log.info("bien instanciee");
			Produit res = ui.createProduit(p);
			log.info("produit--- instanciee");

			//ui.ajouteItem(res, i);
			//log.info("Item bien instanciee");

		}catch (NamingException e) {
			e.printStackTrace();
		}
		catch (ValidationException e) {
			e.printStackTrace();
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		//Produit res = produitRemote.createProduit(p);

		//produitRemote.ajouteItem(p, i);
		//panierBean = (ICaddieRemote) cr.getCartItems();
		panierBean = cr;
		articlesPanier = (ArrayList<CartItem>) panierBean.getCartItems();
		produitRemote = ui;
		//items = ui.findItems();

		items = produitRemote.findItems();



	}
	private final static String[] types;  
	static {  


		types = new String[2];  
		types[0] = "louer";  
		types[1] = "acheter";  

	}  
	int nbitem=0;

	public int getNbitem() {
		return nbitem;
	}

	public void setNbitem(int nbitem) {
		this.nbitem = nbitem;
	}
	private final static int[] quantities;  
	static {  


		quantities = new int[10];  
		for (int i=0; i<10; i++){
			quantities[i] = i;
		}

	}  
	CartItem selectedCartItem;
	public CartItem getSelectedCartItem() {
		return selectedCartItem;
	}

	public void setSelectedCartItem(CartItem selectedCartItem) {
		this.selectedCartItem = selectedCartItem;
	}
	private  ICaddieRemote panierBean;

	String recherche="";
	public String getRecherche() {
		return recherche;
	}

	public void setRecherche(String recherche) {
		this.recherche = recherche;
	}


	public static String[] getTypes() {
		return types;
	}
	//@EJB
	private  ProduitInterface produitRemote;

	private static final String LOOKUP_PRODUIT = "org.ejb.stateless.ProduitStateless@Remote";
	private static final String LOOKUP_CADDIE = "org.ejb.stateful.CaddieStateful@Remote";

	private static final long serialVersionUID = 1L;
	private String choixg = "Tous";
	private String choixc = "Tous";
	int choice;
	private boolean visible=false;
	private boolean visible1=false;
	private static final Logger log = Logger.getLogger("magasin Bean");

	String paiement = "acheter";
	//private 

	public String getPaiement() {
		return paiement;
	}

	public void setPaiement(String paiement) {
		this.paiement = paiement;
	}


	private ArrayList <CartItem> articlesPanier = new ArrayList<CartItem>();
	private ArrayList <CartItem> savePanier = new ArrayList<CartItem>();


	public ArrayList<CartItem> getSavePanier() {
		return savePanier;
	}

	public void setSavePanier(ArrayList<CartItem> savePanier) {
		this.savePanier = savePanier;
	}


	private List<String> genres = new ArrayList<String>();
	private List<String> consoles = new ArrayList<String>();

	public int getChoice() {
		System.out.println("getChoice !!");
		log.info("Appel de la methode getChoice qui retourne "+choice);
		return choice;
	}

	public void setChoice(int choice) {

		System.out.println("setChoice !!");
		log.info("Appel de la methode setChoice("+choice);
		if (choice != 0)
			this.choice = choice;
	}

	int sizeRadio = 1;
	public int getSizeRadio() {
		sizeRadio++;
		return sizeRadio;
	}

	public void setSizeRadio(int sizeRadio) {
		this.sizeRadio = sizeRadio;
	}

	private Item item;
	List<Item> items = null;
	String name;
	String description;
	Integer quantity;
	private double montantTotal;
	//private Pagination pagination = null;
	private BigDecimal quantite;
	private String detailsItemId;  // ID de l'item dont on souhaite voir les details 


	private Item selectedItem;  


	public Item getSelectedItem() {  
		return selectedItem;  
	}  

	public void setSelectedItem(Item selectedItem) {  
		this. selectedItem= selectedItem;  
	}  

	public String getDetailsItemId() {
		return detailsItemId;
	}

	public void setDetailsItemId(String detailsItemId) {
		this.detailsItemId = detailsItemId;
	}

	public int getNombreTotalItems() {
		return items.size();
	}


	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}

	public BigDecimal getQuantite() {
		return quantite;
	}

	public void setQuantite(BigDecimal quantite) {
		this.quantite = quantite;
	}

	public double getMontantTotal() {
		return montantTotal;
	}

	public void setMontantTotal(double montantTotal) {
		this.montantTotal = montantTotal;
	}

	public List<Item> getItems() {
		//log.info("Appel de la methode getItemsIntervalles()");

		//if (items == null) {
		//getPagination();
		//items = getItemsSuivants(pagination.getNombreLignes(), pagination.getPremierItem());
		//}
		//return items;

		//catalogRemote.createItem(new Item ("mgs", coast), new Produit("jeux video", "les jeux video"));
		//items = ui.findItems();
		return items;
	}



	public String getChoixg() {
		return choixg;
	}

	public void setChoixg(String choixg) {
		this.choixg = choixg;
	}

	public String getChoixc() {
		return choixc;
	}

	public void setChoixc(String choixc) {
		this.choixc = choixc;
	}

	public boolean isVisible() {
		return visible;
	}

	public void setVisible(boolean visible) {
		this.visible = visible;
	}

	public boolean isVisible1() {
		return visible1;
	}

	public void setVisible1(boolean visible1) {
		this.visible1 = visible1;
	}

	public List<String> getGenres() {
		return genres;
	}

	public void setGenres(List<String> genres) {
		this.genres = genres;
	}

	public List<String> getConsoles() {
		return consoles;
	}

	public void setConsoles(List<String> consoles) {
		this.consoles = consoles;
	}

	public ArrayList<CartItem> getArticlesPanier() {
		return articlesPanier;
	}

	public void setArticlesPanier(ArrayList<CartItem> articlesPanier) {
		this.articlesPanier = articlesPanier;
	}

	/** fonction fait recherche par type genre */
	public void firegenre(ValueChangeEvent e){
		choixg = (String) e.getNewValue();
		System.out.println("fireGenre 1111111111111111111111111" + choixg);
		System.out.println("fireGenre !!!!!!!!!!!!!!!!!!!!!!!!!!");
		System.out.println("fireGenre 22222222222222222222222222" + choixc);

		items = produitRemote.rechercheArticles(choixg, choixc);
	}

	/** fonction fait recherche par type console */
	public void fireconsole(ValueChangeEvent e){
		choixc = (String) e.getNewValue();
		System.out.println("fireGenre 333333333333333333333333333" + choixc);
		System.out.println("fireGenre !!!!!!!!!!!!!!!!!!!!!!!!!!");
		System.out.println("fireGenre 444444444444444444444444444" + choixg);
		items = produitRemote.rechercheArticles(choixg, choixc);		
	}

	public void ajouter(ActionEvent actionEvent)  {		
		//log.info("Appel de la methode ajouterArticle()");


		Item articleNouveau = selectedItem;

		if (selectedItem.getChoice() == 1){
			paiement = "louer";
		}else {
			paiement = "acheter";
		}


		log.info("tentative d'ajout d'un article !!");


		if (null != articleNouveau) {

			//			
			//			if (choice == 1){
			//				panierBean.addItem(articleNouveau, "louer");
			//			}else {
			//				panierBean.addItem(articleNouveau, "acheter");
			//			}
			panierBean.addItem(articleNouveau, paiement);
			BigDecimal laQuantite = getQuantite();
			log.info("La laQuantite est : " + laQuantite);

			articlesPanier = panierBean.getCartItems();
			recalculate();	
			log.info("La taille de la liste d'articles est : " + articlesPanier.size());
			log.info("Item ajoute !");		

		}
		FacesMessage msg = new FacesMessage("Produit "+articlesPanier.get(articlesPanier.size()-1).getItem().getName()+"ajoute dans le panier" );  
		FacesContext.getCurrentInstance().addMessage(null, msg);  


		//return "panier";
	}
	int nbsave;

	public ICaddieRemote getPanierBean() {
		return panierBean;
	}

	public void setPanierBean(ICaddieRemote panierBean) {
		this.panierBean = panierBean;
	}

	public ProduitInterface getProduitRemote() {
		return produitRemote;
	}

	public void setProduitRemote(ProduitInterface produitRemote) {
		this.produitRemote = produitRemote;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Integer getQuantity() {
		return quantity;
	}

	public void setQuantity(Integer quantity) {
		this.quantity = quantity;
	}

	public void setItems(List<Item> items) {
		this.items = items;
	}

	public void vider(ActionEvent actionEvent) {
		//log.info("Appel de la methode supprimerArticle()");


		//log.info("1 La taille de la liste d'articles avant suppression est : " + articlesPanier.size());
		System.out.println("vider !! ");
		savePanier = panierBean.getCartItems();
		articlesPanier.clear();
		//CartItem art = new CartItem();
		panierBean.empty();
		montantTotal = 0;
		nbsave =nbitem;
		nbitem = 0;
		

	}


	public void supprimer() {
		System.out.println("supprimer !!");
		log.info("Appel de la methode supprimerArticle()");
		//CartItem cartItem = (CartItem)actionEvent.getSource();
		//System.out.println(cartItem.toString());

		if (selectedCartItem != null){
			System.out.println("je suis dans le bon supprime !! "+selectedCartItem.getItem().getName());
			savePanier = panierBean.getCartItems();
			panierBean.removeItem(selectedCartItem.getItem());
			articlesPanier = panierBean.getCartItems();
			recalculate();	
		}
		
		
	}

	public void diminuer() {
		System.out.println("diminuer !!");
		log.info("Appel de la methode diminuer()");
		//CartItem cartItem = (CartItem)actionEvent.getSource();
		//System.out.println(cartItem.toString());

		if (selectedCartItem != null){
			System.out.println("je suis dans le bon supprime !! "+selectedCartItem.getItem().getName());
			savePanier = panierBean.getCartItems();
			panierBean.diminuer(selectedCartItem.getItem());
			articlesPanier = panierBean.getCartItems();
			recalculate();	
		}

		
	}

	public void augmenter() {
		System.out.println("augmenter !!");
		log.info("Appel de la methode augmenter()");
		//CartItem cartItem = (CartItem)actionEvent.getSource();
		//System.out.println(cartItem.toString());

		if (selectedCartItem != null){
			System.out.println("je suis dans le bon supprime !! "+selectedCartItem.getItem().getName());
			savePanier = panierBean.getCartItems();
			panierBean.augmenter(selectedCartItem.getItem());
			articlesPanier = panierBean.getCartItems();
			recalculate();	
		}

	}

	public void changer() {
		System.out.println("changer !!");
		log.info("Appel de la methode changer()");
		//CartItem cartItem = (CartItem)actionEvent.getSource();
		//System.out.println(cartItem.toString());

		if (selectedCartItem != null){
			savePanier = panierBean.getCartItems();
			panierBean.changer(selectedCartItem.getItem());
			articlesPanier = panierBean.getCartItems();
			recalculate();	
		}

		
	}


	public void annuler(ActionEvent actionEvent) {
		System.out.println("annuler !!");
		log.info("Appel de la methode annuler()");
		if (savePanier != null && !savePanier.isEmpty()){
			panierBean.setCartItems(savePanier);
			articlesPanier = savePanier;
			recalculate();	
		}
	}
	
	private void recalculate(){
		nbitem = panierBean.getNbItemTotal();
		montantTotal = panierBean.getTotal();
	}

	public void valider(ActionEvent actionEvent) {
		System.out.println("valider !!");
		log.info("Appel de la methode valider()");
		System.out.println("valider !!!");
		FacesMessage msg = new FacesMessage("vous avez valide votre panier. Nous allons passer au paiement" );  
		FacesContext.getCurrentInstance().addMessage(null, msg); 
	}


	public void rowEditListener(org.primefaces.event.RowEditEvent ev){

		System.out.println("rowEdit !!");

		CartItem cartItem = (CartItem)ev.getObject();
		//CarJpaController ctrlCar = new CarJpaController();

		if(cartItem == null) {
			System.out.println("cartItem is null...");
		} else {
			System.out.println("cartItem is not null ");
			ArrayList<CartItem> tmp = articlesPanier;


		}
		//panierBean.removeItem(cartItem.getItem());

	}

	public void rechercher(){
		System.out.println("on recherche !! ");
		if (recherche != "")
			items = produitRemote.rechercheArticleParNom("p");
	}

	public void ajouterPan(){
		if (selectedItem.getChoice() == 1){
			paiement = "louer";
		}else {
			paiement = "acheter";
		}
		Item articleNouveau = selectedItem;

		log.info("tentative d'ajout d'un article !!");


		if (null != articleNouveau) {

			BigDecimal laQuantite = getQuantite();
			log.info("La laQuantite est : " + laQuantite);
			//			
			//			if (choice == 1){
			//				panierBean.addItem(articleNouveau, "louer");
			//			}else {
			//				panierBean.addItem(articleNouveau, "acheter");
			//			}
			panierBean.addItem(articleNouveau, paiement);



			articlesPanier = panierBean.getCartItems();
			recalculate();	
			log.info("La taille de la liste d'articles est : " + articlesPanier.size());
			log.info("Item ajoute !");		
		}

		FacesMessage msg = new FacesMessage("Produit "+articlesPanier.get(articlesPanier.size()-1).getItem().getName()+"ajoute dans le panier" );  
		FacesContext.getCurrentInstance().addMessage(null, msg);  
	}

	/** 
	 * Method for redirecting a request 
	 * @param url 
	 */  
	private void doRedirect(String url){  
		try {  
			FacesContext context=FacesContext.getCurrentInstance();  
			context.getExternalContext().redirect(url);  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
	}  

	/*
	public String afficherDetails(PhaseEvent event) {
		log.info("Appel de la methode afficherDetails()");

		Item monItem = catalogRemote.rechercheDetails(getDetailsItemId());

    	if (null != monItem){
    		String nomItem = monItem.getNom();
    		log.info("Le nom de l'item est :" + nomItem);
    		item = monItem;    		
    	} else {
    		log.info("ARTICLE NUL");
    	}
    	return "/magasin/afficherDetails";
	}*/
	public void validerAchat(){
		System.out.println("validerAchat");
		for(CartItem i : articlesPanier){
			for(Item it : items){
				if(it.getName().equals(i.getItem().getName()) && it.getConsole().equals(i.getItem().getConsole())){
					it.setQuantity(it.getQuantity() - i.getQuantity());
					ui.updateItem(it);
				}
			}
		}
		articlesPanier.clear();
		panierBean.empty();
		montantTotal = 0;
		nbitem=0;
	}

}
